import orderModel from '../models/orderModel.js';
import userModel from '../models/userModel.js';
import Stripe from 'stripe';
import dotenv from 'dotenv';
dotenv.config();

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

/**
 * 异步处理下单请求
 * @param {Object} req - 请求对象，包含用户ID、商品项、金额和地址
 * @param {Object} res - 响应对象，用于发送响应给客户端
 */
const placeOrder = async (req, res) => {
  try {
    // 从请求体中提取必要信息
    const { userId, items, amount, address } = req.body;

    // 检查是否存在缺失的必要字段
    if (!userId || !items || !amount || !address) {
      console.log('Missing required fields', {
        userId,
        items,
        amount,
        address,
      });
      return res
        .status(400)
        .json({ success: false, message: 'Missing required fields' });
    }

    // 创建新的订单模型实例
    const newOrder = new orderModel({
      userId,
      items,
      amount,
      address,
    });

    // 保存订单到数据库
    await newOrder.save();

    // 将商品项映射为条目，用于支付处理
    const line_items = items.map((item) => ({
      price_data: {
        currency: 'usd',
        product_data: {
          name: item.name,
        },
        unit_amount: item.price * 100,
      },
      quantity: item.quantity,
    }));

    // 创建Stripe支付会话
    const session = await stripe.checkout.sessions.create({
      payment_method_types: ['card'],
      mode: 'payment',
      line_items,
      success_url: `http://localhost:3000/verify?success=true&orderId=${newOrder._id}`,
      cancel_url: `http://localhost:3000/verify?success=false&orderId=${newOrder._id}`,
    });

    // 发送成功响应和会话URL给客户端
    res.json({ success: true, session_url: session.url });
  } catch (error) {
    console.log('Error in placeOrder:', error.message);
    res.status(500).json({ success: false, message: 'Error placing order' });
  }
};


/**
 * 异步获取所有订单
 * @param {Object} req - Express请求对象，包含客户端请求的信息
 * @param {Object} res - Express响应对象，用于向客户端发送响应
 */
const listOrders = async (req, res) => {
  try {
    // 查询数据库中的所有订单
    const orders = await orderModel.find({});
    // 将查询结果以JSON格式返回给客户端
    res.json({ success: true, data: orders });
  } catch (error) {
    // 记录错误日志
    console.log('Error in listOrders:', error.message);
    // 返回500状态码及错误信息
    res.status(500).json({ success: false, message: 'Error listing orders' });
  }
};


/**
 * 异步获取用户的订单信息
 * @param {Object} req - 请求对象，包含用户ID信息
 * @param {Object} res - 响应对象，用于发送响应数据
 */
const userOrders = async (req, res) => {
  try {
    // 根据请求体中的userId查询订单信息
    const orders = await orderModel.find({ userId: req.body.userId });
    console.log(orders);
    // 返回成功响应，包含订单数据
    res.json({ success: true, data: orders });
  } catch (error) {
    // 捕获异常并记录错误信息
    console.log('Error in userOrders:', error.message);
    // 返回错误响应，包含错误信息
    res
      .status(500)
      .json({ success: false, message: 'Error fetching user orders' });
  }
};


/**
 * 异步更新订单状态。
 * @param {Object} req - 请求对象，包含要更新的订单ID和状态。
 * @param {Object} res - 响应对象，用于返回操作结果。
 */
const updateStatus = async (req, res) => {
  try {
    // 使用订单模型更新指定订单ID的状态。
    await orderModel.findByIdAndUpdate(req.body.orderId, {
      status: req.body.status,
    });
    // 更新完成后返回成功的JSON对象。
    res.json({ success: true, message: 'Status updated' });
  } catch (error) {
    // 当发生错误时，记录错误信息。
    console.log('Error in updateStatus:', error.message);
    // 当发生错误时，返回错误的JSON对象。
    res.status(500).json({ success: false, message: 'Error updating status' });
  }
};


/**
 * 验证订单并根据支付成功与否更新订单状态
 * @param {Object} req Express请求对象，包含orderId和success信息
 * @param {Object} res Express响应对象，用于发送响应
 */
const verifyOrder = async (req, res) => {
  // 从请求体中提取orderId和success标志
  const { orderId, success } = req.body;

  try {
    // 根据success标志更新订单状态或删除订单
    if (success === 'true') {
      // 更新订单为已支付状态，并返回更新后的订单
      const updatedOrder = await orderModel.findByIdAndUpdate(
        orderId,
        { isPaid: true },
        { new: true }
      );
      // 发送成功响应，包含更新后的订单信息
      res.json({ success: true, order: updatedOrder });
    } else {
      // 删除未成功支付的订单
      await orderModel.findByIdAndDelete(orderId);
      // 发送失败响应，表明支付未被验证
      res.json({ success: false, message: 'Payment not verified' });
    }
  } catch (error) {
    // 捕获并记录错误，发送服务器错误响应
    console.log('Error in verifyOrder:', error.message);
    res
      .status(500)
      .json({ success: false, message: 'Error verifying payment' });
  }
};


export { placeOrder, listOrders, userOrders, updateStatus, verifyOrder };
